﻿using System;
using System.Collections.Generic;

using System.Text;

namespace Sinacor.Tools.Entidade
{
    [Serializable()]
    public class Mensagem : IComparer<Mensagem>, ICloneable
    {
        private int? _id;
        public int? Id
        {
            get { return this._id; }
            set { this._id = value; }
        }

        private byte? _idExceptionMessage;
        public byte? IDExceptionMessage
        {
            get { return this._idExceptionMessage; }
            set { this._idExceptionMessage = value; }
        }

        private int? _idException;
        public int? IDException
        {
            get { return this._idException; }
            set { this._idException = value; }
        }


        private StatusMensagem _statusMensagem = new StatusMensagem();
        public StatusMensagem StatusMensagem
        {
            get { return this._statusMensagem; }
            set { this._statusMensagem = value; }
        }

        public byte? CodigoStatus
        {
            get { return this._statusMensagem.Id; }
        }
        public string DescricaoStatus
        {
            get { return this._statusMensagem.Descricao; }
        }
        

        private Enum.TipoFiltroMensagem _tipoFiltroMensagem;
        public Enum.TipoFiltroMensagem TipoFiltroMensagem
        {
            get { return this._tipoFiltroMensagem; }
            set { this._tipoFiltroMensagem = value; }
        }

        private TipoMensagem _tipoMensagem = new TipoMensagem();
        public TipoMensagem TipoMensagem
        {
            get { return this._tipoMensagem; }
            set { this._tipoMensagem = value; }
        }

        public byte? CodigoTipo
        {
            get { return this._tipoMensagem.Id; }
        }

        public byte? CodigoIdioma
        {
            get { return this._traducao.Idioma.Id; }
        }

        public string DescricaoTipo
        {
            get { return this._tipoMensagem.Descricao; }
        }


        private TraducaoMensagem _traducao = new TraducaoMensagem();
        public TraducaoMensagem Traducao
        {
            get { return this._traducao; }
            set { this._traducao = value; }
        }

        public string DescricaoMensagem
        {
            get { return this._traducao.MensagemTraduzida; }
        }

        
        public StatusTraducao StatusTraducao
        {
            get { return this._traducao.StatusTraducao; }
            set { this._traducao.StatusTraducao = value; }
        }

        public byte? CodigoStatusTraducao
        {
            get { return this._traducao.StatusTraducao.Id; }
        }



        private string _proprosito = string.Empty;
        public string Proposito
        {
            get { return this._proprosito; }
            set { this._proprosito = value; }
        }

        private string _modulo = string.Empty;
        public string Modulo
        {
            get { return this._modulo; }
            set { this._modulo = value; }
        }

        private string _submodulo = string.Empty;
        public string Submodulo
        {
            get { return this._submodulo; }
            set { this._submodulo = value; }
        }

        private string _resourceKey = string.Empty;
        public string ResourceKey
        {
            get { return this._resourceKey; }
            set { this._resourceKey = value; }
        }

        private string _resourceKey2 = string.Empty;
        public string ResourceKey2
        {
            get { return this._resourceKey2; }
            set { this._resourceKey2 = value; }
        }


        public string DescricaoStatusTraducao
        {
            get { return this._traducao.StatusTraducao.Descricao; }
        }

        public string DescricaoIdioma
        {
            get { return this._traducao.Idioma.Descricao;  }

        }

        

        private static string _propriedadeSort = string.Empty;
        public static string PropriedadeSort
        {
            set { _propriedadeSort = value; }
            get { return _propriedadeSort; }
        }

        private string _usuarioLogado = string.Empty;
        public string UsuarioLogado
        {
            get { return this._usuarioLogado; }
            set { this._usuarioLogado = value; }
        }
        
        public string UsuarioLogadoMensagem
        {
            get
            {
                if (_traducao != null)
                    return _traducao.UsuarioLogado;
                else
                    return string.Empty;
            }
        }
        

        #region IComparer<Mensagem> Members

        public int Compare(Mensagem x, Mensagem y)
        {
            int resultado = 0;
            switch (_propriedadeSort.ToLower())
            {
                case "modulo":
                    resultado = string.Compare(x._modulo, y._modulo);
                    break;

                case "submodulo":
                    resultado = string.Compare(x._submodulo, y._submodulo);
                    break;

                case "proposito":
                    resultado = string.Compare(x._proprosito, y._proprosito);                    
                    break;

                case "codigoidioma":
                    resultado = Nullable.Compare<byte>(x.CodigoIdioma, y.CodigoIdioma);
                    break;

                case "codigostatus":
                    resultado = Nullable.Compare<byte>(x.CodigoStatus, y.CodigoStatus);
                    break;

                case "codigotipo":
                    resultado = Nullable.Compare<byte>(x.CodigoTipo, y.CodigoTipo);
                    break;
                case "codigostatustraducao":
                    resultado = Nullable.Compare<byte>(x.CodigoStatusTraducao, y.CodigoStatusTraducao);
                    break;

                case "descricaomensagem":
                    resultado = string.Compare(x.DescricaoMensagem, y.DescricaoMensagem);                    
                    break;

                case "descricaostatus":
                    resultado = string.Compare(x.DescricaoStatus, y.DescricaoStatus);                    
                    break;

                case "descricaotipo":
                    resultado = string.Compare(x.DescricaoTipo, y.DescricaoTipo);
                    break;

                case "resourcekey":
                    resultado = string.Compare(x.ResourceKey, y.ResourceKey);
                    break;

                case "resourcekey2":
                    resultado = string.Compare(x.ResourceKey2, y.ResourceKey2);
                    break;

                case "usuariologado":
                    resultado = string.Compare(x.UsuarioLogado, y.UsuarioLogado);
                    break;

                case "tipofiltromensagem":
                    resultado = string.Compare(x.TipoFiltroMensagem.ToString(), y.TipoFiltroMensagem.ToString());
                    break;

                //o id é obrigatório, nunca será nulo na ordenação
                default:
                    resultado = Nullable.Compare<int>(x.Id, y.Id);
                    break;
            }
            return resultado;            
        }

        #endregion

        #region ICloneable Members

        public object Clone()
        {
            Mensagem msg = new Mensagem();
            msg._id = this.Id;
            //TODO:EDU - completar copia dos outros campos - 200809191955
            msg._modulo = this._modulo;
            msg._proprosito = this._proprosito;
            msg._resourceKey = this._resourceKey;
            
            msg._statusMensagem = this._statusMensagem;
            msg._submodulo = this._submodulo;
            msg._tipoMensagem = this._tipoMensagem;
            
            msg._traducao = this._traducao;
            msg._resourceKey2 = this._resourceKey2;
            msg._usuarioLogado = this._usuarioLogado;

            msg._tipoFiltroMensagem = this._tipoFiltroMensagem; 

            return msg;
        }

        #endregion
    }
}
